package com.woniuxy.myfinance.aop;

import com.woniuxy.commons.stafflog.LogRequirePerms;

import com.woniuxy.myfinance.service.StaffLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Method;

/**
 * @author author
 * @create 2021-11-13 14:24  定义日志切面
 */

@Aspect   //表示该类是个切面类
@Component
public class LogAop {



    @Resource
    private StaffLogService staffLogService;

    //环绕通知+切入点表达式
   @AfterReturning("execution(* com.woniuxy.myfinance.controller.*.*(..))")
    public void doAfter(JoinPoint joinPoint){
        /**
         * 解析Log注解   joinpoint为切入点
         */
        String methodName = joinPoint.getSignature().getName();  //得到切入点的方法名字
        Method method = currentMethod(joinPoint,methodName);  //得到方法
        LogRequirePerms log = method.getAnnotation(LogRequirePerms.class); //得到该方法上的注解
       staffLogService.addStaffLog(joinPoint, methodName, log.module(),
                log.description());   //调用添加日志的service方法


    }


    /**
     * 获取当前执行的方法
     *
     * @param joinPoint  连接点
     * @param methodName 方法名称
     * @return 方法
     */
    private Method currentMethod(JoinPoint joinPoint, String methodName) {
        /**
         * 获取目标类的所有方法，找到当前要执行的方法
         */
        Method[] methods = joinPoint.getTarget().getClass().getMethods();
        Method resultMethod = null;
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                resultMethod = method;
                break;
            }
        }
        return resultMethod;
    }


}
